package jfoundation.dataobject.classes;

import java.util.*;

import org.jdom.*;

import com.core.xml.*;

//import jframework.foundation.classes.*;
//import jtoolkit.xml.classes.*;
//import jfoundation.sql.classes.JConnection;
//import java.sql.Connection;
//import jservice.jdal.classes.DALDBManagerObject.JIDSManager;
/**
 * <p>Title: Java Framework</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2002</p>
 * <p>Company: </p>
 * @author Skyline
 * @version 1.0
 */
//--------------------------------------------------------------------------------------------------
//描述:
//设计: Skyline(2001.12.29)
//实现: Skyline
//修改:
//--------------------------------------------------------------------------------------------------
public class JParamObject extends JDOMXMLBaseObject implements java.io.Serializable{

  /**
   *
   * @return Object
   */
  public Object clone() {
    JParamObject po = new JParamObject();
    po.mPOValues.putAll(this.mPOValues);
    return null;
  }
  /**
   *
   * @param EAIPO JParamObject
   * @return JParamObject
   */
  public static JParamObject getParamObject(com.efounder.eai.data.JParamObject
                                            EAIPO) {
    JParamObject po = new JParamObject();
    po.paramObject = EAIPO;
    return po;
  }
  /**
   *
   * @return JParamObject
   */
  public com.efounder.eai.data.JParamObject getEAIParamObject() {
    return paramObject;
  }

  /**
   * 不需要序列化
   */
  protected transient com.efounder.eai.data.JParamObject paramObject = null;

  protected transient Object loginStub = null;

  public Object getLoginStub() {
    return loginStub;
  }
  public void setLoginStub(Object loginStub) {
    this.loginStub = loginStub;
  }
  public transient Object httpServletRequest  = null;
  public Object getHttpServletRequest() {
    return httpServletRequest;
  }
  public void setHttpServletRequest(Object httpServletRequest) {
    this.httpServletRequest = httpServletRequest;
  }
  public transient Object httpServletResponse = null;
  public Object getHttpServletResponse() {
    return httpServletResponse;
  }
  public void setHttpServletResponse(Object httpServletResponse) {
    this.httpServletResponse = httpServletResponse;
  }
  /**
   *
   */
  public transient Object httpServlet = null;
  /**
   *
   * @return HttpServlet
   */
  public Object getHttpServlet() {
    return httpServlet;
  }
  /**
   *
   * @param httpServlet HttpServlet
   */
  public void setHttpServlet(Object httpServlet) {
    this.httpServlet = httpServlet;
  }
  /**
   *
   */
  static final long serialVersionUID = 1L;


















  static private String       EnvString = null;
  private Element     EnvRoot     = null;
  private Element     ParamRoot   = null;
  private HashMap    mPOValues   = new HashMap();

  //用来存放不同系统的PO的串，以实现一个工作界面，多个PO的状态。
  private static Hashtable mPOStringMap = new Hashtable();
  /**
   * 增加一个JConnection连接，由于现在程序有些人创建了连接后，
   * 未能释放，所以在此做个处理，在向客户端回写数据时，判断一下，
   * 如果未释放资源，则强制关闭
   * 很变态！不走寻常路呀!
   */
//  protected transient Connection conn = null;
  //----------------------------------------------------------------------------------------------
  //描述: 构造函数
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public JParamObject() {
      try {
        paramObject = com.efounder.eai.data.JParamObject.Create();
          createEmptyPO();
      } catch ( Exception e) {e.printStackTrace();}
  }
  /**
   *
   */
  protected void createEmptyPO() {
      ROOT_NAME = "paramstack";
      CreateXmlEmpty();
      EnvRoot     = CreateElement("environments");
      ParamRoot   = CreateElement("params");
      Root.addContent(EnvRoot);
      Root.addContent(ParamRoot);
  }

  /**
   * 取指定Server的PO
   * @param pSvrID String
   * @return String
   */
  public static String getPOByServer(String pSvrID){
    Object POBJ = mPOStringMap.get(pSvrID);

    /**
     * 如果没有找到
     * 需要重新初始化此PO
     */
    if ( POBJ == null ){
//      JAppSvrManager.onLoadServerPO(pSvrID);

      // 重新读取
      POBJ = mPOStringMap.get(pSvrID);
    }

    if ( POBJ != null ){
      return (String)POBJ;
    }
    else{
      return EnvString;
    }
  }


  public static boolean isExistServerPO(String pSvrID){
    Object POBJ = mPOStringMap.get(pSvrID);
    return ( POBJ != null );
  }

  public static void setPOByServer(String pSvrID,String pPO){
    Object POBJ = mPOStringMap.get(pSvrID);
    if (POBJ != null) {
      mPOStringMap.remove(pSvrID);
    }
    mPOStringMap.put(pSvrID, pPO);
  }




  public static void setDefaultEnvString(String pStr){
    EnvString = pStr;
  }

  /**
   * 取默认PO String
   * @return JParamObject
   */
  public static String getDefaultEnvString(){
      return EnvString;
  }

  /**
   * 取默认PO
   * @return JParamObject
   */
  public static JParamObject getDefaultPO(){
      if(EnvString == null){
          return null;
      }
      return new JParamObject(EnvString);
  }

  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  static public JParamObject Create() {
    String pActiveSvr = getActiveServer();
    String pEnvText   = null;
    //没有指定服务器，使用缺省的。
    if ( pActiveSvr == null ){
      pEnvText = EnvString;
    }
    else{
      //指定并找到，使用保存的。
      pEnvText = getPOByServer(pActiveSvr);
    }

    if (EnvString == null)return new JParamObject();

    JParamObject pNewPO = new JParamObject(pEnvText);
    setupAutoCommBase(pNewPO);
    pNewPO.__env_map_key__ = (String)pNewPO.mPOValues.get("E_"+__ENV_MAP_KEY__);// pNewPO.GetValueByEnvName(__ENV_MAP_KEY__,null);
    return pNewPO;
  }

  /**
   * 建一个指向指定SERVER的PO。而不是根据调用路径自动确定。
   * @param pServerID String
   * @return JParamObject
   */
  static public JParamObject Create(String pServerID) {
    String pActiveSvr = pServerID;
    String pEnvText   = null;
    //没有指定服务器，使用缺省的。
    if ( pActiveSvr == null ){
      pEnvText = EnvString;
    }
    else{
      //指定并找到，使用保存的。
      pEnvText = getPOByServer(pActiveSvr);
    }

    if (EnvString == null)return new JParamObject();

    JParamObject pNewPO = new JParamObject(pEnvText);
    setupAutoCommBase(pNewPO);
    pNewPO.__env_map_key__ = (String)pNewPO.mPOValues.get("E_"+__ENV_MAP_KEY__);// pNewPO.GetValueByEnvName(__ENV_MAP_KEY__,null);
    return pNewPO;
  }
  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public JParamObject(String ParamString) {
    initPO(ParamString);
  }
  public void initPO(String ParamString) {
    try {
      InitXMLString(ParamString);
      EnvRoot     = GetElementByName("environments");
      ParamRoot   = GetElementByName("params");
    } catch ( Exception e ) {e.printStackTrace();}


    /**
     * 下面开始把XML里的值，转到内存中。
     * XLS!
     */
    List pChildren = EnvRoot.getChildren();
    PickValues(pChildren);

    pChildren = ParamRoot.getChildren();
    PickValues(pChildren);

    __env_map_key__ = (String)mPOValues.get("E_"+__ENV_MAP_KEY__);
  }

  private void PickValues(List pChildren) {
    int  iSize     = pChildren.size();
    String pName = null;
    String pValue = null;
    java.util.Map xPOValues = null;
    for ( int i = 0; i < iSize; i ++){
      Element pEL = (Element)(pChildren.get(i));
      pName = pEL.getName();
      //获得属性value的值，即为变量的值。
      Attribute attr = pEL.getAttribute("value");
      if ( attr != null ) {
        pValue = attr.getValue();
      }

      //判断是Env还是Param
      //String pType = pName.substring(0,2);
      //pValue= pValue.substring(2);
      // change by xSkyline 2008.12.23
      // 如果是BSCONF中的变量（一般是它，也有可能不是）
      if ( checkXenv(pName) ) {
          if ( xPOValues == null ) xPOValues = new java.util.HashMap();
          putXEnvMap(xPOValues,pName,pValue);
      } else {
          mPOValues.put(pName, pValue);
      }
      String mapKey = (String)mPOValues.get("E_"+__ENV_MAP_KEY__);//GetValueByEnvName(__ENV_MAP_KEY__,null);
      if ( xPOValues != null && mapKey != null ) {
          setBackEnvMap(mapKey,xPOValues);
      }
    }
  }

  /**
   * 把哈希的变量，存储至XML中。
   */
  private void UpdateXml(){
      // 新建文档对象
    createEmptyPO();
    Set pValues = mPOValues.keySet();
    Object[] pKeys = pValues.toArray();
    String pKey = null;
    String pVal = null;
    Object object = null;
    for ( int i = 0; i < pKeys.length; i ++){
      pKey = (String)(pKeys[i]);
      object = mPOValues.get(pKey);
      if(object != null){
          pVal = object.toString();
      }else{
          pVal = "";
      }

      //判断是Env还是Param
      String pType = pKey.substring(0,2);
      Element pParentEle = pType.equals("E_")?EnvRoot:ParamRoot;
      //更新元素。
      Element pElement = pParentEle.getChild(pKey);
      // add by xSkyline 2008.12.23
      if ( pElement != null && this.checkXenv(pKey) ) { // 如果元素不为空，且，是Xenv，则删除
          pParentEle.removeChild(pKey);
          continue;
      }
      if ( pElement == null ){
        //没有，则新建。
        pElement = new Element(pKey);
        pParentEle.addContent(pElement);
      }
      pElement.setAttribute("value",pVal);
    }
  }

  /**
   * 自动判断，生成一个调用地址。
   * @return String
   */
  public static String setupAutoCommBase(JParamObject pInputPO) {
//    String strCommBase = "";
//    /**
//     * 新加的处理过程。自动判断调用来原及服务器对象位于哪个服务器上。
//     */
//    String pClsName = null;
//
//    /**
//     *制造异常，获得调用祖先。
//     */
////    JAppSvrStub pSvr = null;
//    try {
//      int i = 1 / 0;
//    }
//    catch (Exception E) {
//      StackTraceElement[] pELS = E.getStackTrace();
//      StringBuffer pRES = new StringBuffer();
//
//      for (int i = 0; i < pELS.length; i++) {
//        pClsName = pELS[i].getClassName();
//
////        pSvr = JAppSvrManager.getDefault().getServerByClassInfo(pClsName);
////        if (pSvr != null) {
////          strCommBase = pSvr.getUrl();
//          //设置调者的目的服务器。
////          pInputPO.SetValueByParamName("Server", pSvr.getName());
////          pInputPO.SetValueByParamName("DBServer", pSvr.getName());
//          pInputPO.SetValueByParamName("CommBase", strCommBase);
//          /**
//           * 找到服务地址后，顺便将数据库的地址也写入。以防止因缓存导致的串库现象
//           * likebing 2011.5.26
//           */
////          Properties pInfos = JIDSManager.getDefault().getDSInfo(pSvr.getName());
//          if(pInfos == null){
////            System.out.print("!!!!!!!! serious Error due not to find DServer info. set direct conn!!!!!!!!");
//            pInputPO.SetValueByParamName("Server", "");
//          }else{
////            System.out.println("*******Tips: load local DSInfo to connection remote DB*******");
//            pInputPO.SetValueByParamName("host", pInfos.getProperty("host"));
//            pInputPO.SetValueByParamName("port", pInfos.getProperty("port"));
//            pInputPO.SetValueByParamName("db", pInfos.getProperty("db"));
//            pInputPO.SetValueByParamName("sid", pInfos.getProperty("sid"));
//            pInputPO.SetValueByParamName("db", pInfos.getProperty("db"));
//            pInputPO.SetValueByParamName("username",
//                                         pInfos.getProperty("username"));
//            pInputPO.SetValueByParamName("userpass",
//                                         pInfos.getProperty("userpass"));
//            pInputPO.SetValueByParamName("ds", pInfos.getProperty("ds"));
//          }
//          //找到了资金系统调用。
//          break;
//        }
//      }
//    }
//    return strCommBase;
	  return null;
  }

  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public void DeleteParam() {
      if ( Root != null && ParamRoot != null ) {
          Root.removeContent(ParamRoot);
          ParamRoot   = CreateElement("params");
          Root.addContent(ParamRoot);
      }


  }

  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public String GetParamString() {
    String ParamString = null;
      if ( Doc != null ){
        ParamString = GetRootXMLString();
      }
//      System.out.println(ParamString);
      return ParamString;
  }

  public String GetRootXMLString() {
    UpdateXml();
    return GetXMLString(Doc);
  }

  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public String GetValueByParamName(String ParamName) {
    return GetValueByParamName(ParamName,"");
//    Element ParamE;String Text=null;
//    ParamE = GetElementByName("P_"+ParamName);
//    if ( ParamE != null ) {
//      Attribute attr = ParamE.getAttribute("value");
//      if ( attr != null ) {
//        Text = attr.getValue();
//      }
//    }
//    if ( Text == null ) Text = "";
//    return Text;
  }
  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public String GetValueByParamName(String ParamName,String Defalut) {
    Object pVal = this.mPOValues.get("P_"+ParamName);
    return pVal!=null?pVal.toString():Defalut;

//    Element ParamE;String Text=null;
//    ParamE = GetElementByName("P_"+ParamName);
//    if ( ParamE != null ) {
//      Attribute attr = ParamE.getAttribute("value");
//      if ( attr != null ) {
//        Text = attr.getValue();
//      }
//    }
//    if ( Text == null ) Text = Defalut;
//    return Text;

  }
  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public int GetIntByParamName(String ParamName) {
    return GetIntByParamName(ParamName,-1);
  }
  public int GetIntByParamName(String ParamName,int Default) {
    int Res = Default;
    try {
    Res = Integer.valueOf(GetValueByParamName(ParamName)).intValue();
    } catch ( Exception e ) {}
    return Res;
  }

  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public String GetValueByEnvName(String EnvName) {
    return GetValueByEnvName(EnvName,"");
//    Element ParamE;String Text=null;
//    ParamE = GetElementByName("E_"+EnvName);
//    if ( ParamE != null ) {
//      Attribute attr = ParamE.getAttribute("value");
//      if ( attr != null ) {
//        Text = attr.getValue();
//      }
//    }
//    if ( Text == null ) Text = "";
//    return Text;
  }
  public String GetValueByEnvName(String EnvName,String Default) {
      // change by xSkyline 2008.12.23
      Object pVal = this.mPOValues.get("E_"+EnvName);
      // 增加
      if ( pVal == null ) {
          pVal = getXEnvValue(EnvName,Default);
      }
      return pVal!=null?pVal.toString():Default;
//    Object pVal = this.mPOValues.get("E_"+EnvName);
//    return pVal!=null?pVal.toString():Default;
//    Element ParamE;String Text=null;
//    ParamE = GetElementByName("E_"+EnvName);
//    if ( ParamE != null ) {
//      Attribute attr = ParamE.getAttribute("value");
//      if ( attr != null ) {
//        Text = attr.getValue();
//      }
//    }
//    if ( Text == null ) Text = Default;
//    return Text;
  }

  public HashMap getPoValuesMap() {
    return mPOValues;
  }
  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public int GetIntByEnvName(String EnvName) {
    return GetIntByEnvName(EnvName,-1);
//    int Res = -1;
//    try {
//      Res = Integer.valueOf(GetValueByEnvName(EnvName)).intValue();
//    } catch ( Exception e ) {
//
//    }
//    return Res;
  }
  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public int GetIntByEnvName(String EnvName,int Def) {
    int Res = Def;
    try {
      Res = Integer.valueOf(GetValueByEnvName(EnvName)).intValue();
    } catch ( Exception e ) {

    }
    return Res;
  }
  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public void SetValueByParamName(String ParamName,String ParamValue) {
    String pName = "P_"+ParamName;
    mPOValues.remove(pName);
    mPOValues.put(pName,ParamValue);
//    Element ParamE=null;
//    if ( ParamValue == null ) return;
//      ParamE = GetElementByName("P_"+ParamName);
//      if ( ParamE == null  ) {
//          ParamE = CreateElement("P_" + ParamName);
//          ParamRoot.addContent(ParamE);
//      }
//      ParamE.setAttribute("value",ParamValue);
  }
  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public void SetIntByParamName(String ParamName,int ParamValue) {
    SetValueByParamName(ParamName,String.valueOf(ParamValue));
  }
  //----------------------------------------------------------------------------------------------
  //描述:
  //设计: Skyline(2001.12.29)
  //实现: Skyline
  //修改:
  //----------------------------------------------------------------------------------------------
  public void SetValueByEnvName(String EnvName,String EnvValue) {
    String pName = "E_"+EnvName;
    mPOValues.remove(pName);
    mPOValues.put(pName,EnvValue);
//        Element ParamE=null;
//        if ( EnvValue == null ) return;
//          ParamE = GetElementByName("E_"+EnvName);
//          if ( ParamE == null  ) {
//              ParamE = CreateElement("E_" + EnvName);
//              EnvRoot.addContent(ParamE);
//          }
//          ParamE.setAttribute("value",EnvValue);
    }
    //----------------------------------------------------------------------------------------------
    //描述:
    //设计: Skyline(2001.12.29)
    //实现: Skyline
    //修改:
    //----------------------------------------------------------------------------------------------
    public void SetIntByEnvName(String ParamName,int ParamValue) {
      SetValueByEnvName(ParamName,String.valueOf(ParamValue));
  }

  /**
   * 重新设置环境变量
   * @param xml String
   */
  public static void setEnvString(String xml){
    String pActiveSvr = getActiveServer();
    String pEnvText = null;
    //没有指定服务器，使用缺省的。
    if (pActiveSvr == null) {
      EnvString = xml;
    }
    else {
      //指定并找到，使用保存的。
      setPOByServer(pActiveSvr,xml);
    }
  }

  /**
   * 重新设置环境变量
   * @param xml String
   */
  public static void setEnvString(String pActiveSvr,String xml){
    //指定并找到，使用保存的。
    setPOByServer(pActiveSvr,xml);
  }

  /**
   * 自动判断，生成一个调用地址。
   * @return String
   */
  public static String getActiveServer() {
    /**
     * 新加的处理过程。自动判断调用来原及服务器对象位于哪个服务器上。
     */
//    String pClsName = null;
//    /**
//     *制造异常，获得调用祖先。
//     */
//    JAppSvrStub pSvr = null;
//    try {
//      int i = 1 / 0;
//    }
//    catch (Exception E) {
//      StackTraceElement[] pELS = E.getStackTrace();
//      StringBuffer pRES = new StringBuffer();
//
//      for (int i = 0; i < pELS.length; i++) {
//        pClsName = pELS[i].getClassName();
//
//        pSvr = JAppSvrManager.getDefault().getServerByClassInfo(pClsName);
//        if (pSvr != null) {
//          return pSvr.getName();
//        }
//      }
//    }
    return null;
  }

  /**
   * clearServerEvn
   */
  public static void ClearServerEvn(){
    mPOStringMap.clear();
  }








  // 此标志不是 Jaguar XF 的标志，是不进行序列化传输的标志，
  public static final String __XF__ = "XF_";
  public static final String __E_XF__ = "E_XF_";
  public static final String __ENV_MAP_KEY__ = "_envMapKey_";
  public Object getXEnvValue(String envName,Object def) {
      if ( __env_map_key__ == null ) return def;
      // 根据 __env_map_key__ 获取不需传输的envMap
      Map envMap = getBackEnvMap(__env_map_key__);
      Object res = def;
      if ( envMap != null ) {
        res = envMap.get(__E_XF__+envName);
        if(res==null){
          res = envMap.get(envName);
        }
        if ( res == null ) res = def;
      }
      return res;
  }

  protected String __env_map_key__ = null;
  /**
   *
   * @param xPOValues Map
   * @param pName String
   * @param pValue String
   */
  protected void putXEnvMap(java.util.Map xPOValues,String pName,String pValue) {
      xPOValues.put(pName,pValue);
  }
  /**
   *
   * @param pName String
   * @return boolean
   */
  protected boolean checkXenv(String pName) {
      return pName.startsWith(JParamObject.__E_XF__);
  }
  /**
   *
   */
  protected static Map backEnvMap = null;
  /**
   *
   * @param key Object
   * @return Map
   */
  public static Map getBackEnvMap(Object key) {
      if ( backEnvMap == null ) return null;
      return (Map)backEnvMap.get(key);
  }
  /**
   *
   * @param key Object
   * @param xenvMap Map
   */
  public static void setBackEnvMap(Object key,Map xenvMap) {
      if ( backEnvMap == null ) backEnvMap = new java.util.HashMap();
      Map xxMap = (Map)backEnvMap.get(key);
      if ( xxMap == null ) { // 如果不存在，设置
          backEnvMap.put(key, xenvMap);
      } else { // 如果已经存在，则增加进行
          xxMap.putAll(xenvMap);
      }
  }

  /**
   * 取完整的PO
   * 包含缓存部分的PO
   * @return JParamObject
   */
  public JParamObject getWholePO(){
      if (__env_map_key__ == null)return this;
      // 根据 __env_map_key__ 获取不需传输的envMap
      Map envMap = getBackEnvMap(__env_map_key__);
      if (envMap == null) {
          return this;
      }
      String key, value;
      Set keySet = envMap.keySet();
      for (Iterator it = keySet.iterator(); it.hasNext(); ) {
          key = (String) it.next();
          if(key != null && key.startsWith(__E_XF__)){
              value = (String) envMap.get(key);
              key = key.substring(__E_XF__.length());
              mPOValues.put("E_" + key, value);
          }
      }
      return this;
  }
//  /**
//   * 设置连接
//   */
//  public void setConnection(Connection con){
//    conn = con;
//  }
//  /**
//   * 获得连接
//   */
//  public Connection getConnection(){
//    return conn;
//  }
}
